package com.it.App.shiro;

import com.it.App.eneity.User;
import com.it.App.mapper.UserMapper;
import com.it.App.service.impl.UserServiceImpl;
import com.it.App.token.JwtToken;
import com.it.App.utils.StringUtil;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @DateTime: 2023/11/28/14:19
 * @注释: 用户登录时验证用户输入的密码是否与数据库中存储的密码匹配
 **/
@Component
public class MyCredentialsMatcher extends SimpleCredentialsMatcher {
    @Autowired
    private UserServiceImpl userService;

    // 使用自定义token进行密码匹配
    @Override
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        // 将AuthenticationToken强制转换为JwtToken，因为我们在该项目中使用了自定义的JwtToken
        JwtToken jwtToken = (JwtToken) token;

        // 如果密码为空，表示无需进行密码匹配，直接返回true
        if (jwtToken.getPassword() == null) {
            return true;
        }

        // 获得用户输入的密码
        String inPassword = new String(jwtToken.getPassword());

        // 获得数据库中的用户名
        String username = String.valueOf(info.getPrincipals());

        // 获取数据库中保存的用户信息，包括密码和盐
        User user = userService.selectUserByName(username);

        // 获取数据库中的密码
        String dbPassword = user.getPassword();

        // 获取盐
        String salt = user.getSalt();

        // 进行密码的比对，使用MD5加盐方式
        return this.equals(StringUtil.md5(inPassword + salt), dbPassword);
    }
}
